import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;

/**
 * Es la clase enemiga del usuario, únicamente aparece en el tercer nivel.
 * 
 * @author Ulises Yamil Castorena Caldera
 * @version 1.0
 */
public class Enemy extends Actor
{
    private int radio;//Variable que determina el radio de busqueda.
    private boolean ocupado;//Indica si se encuentra ocupado o no.
    private Actor obj;//Guarda al objeto que va a disparar.
    private GreenfootSound son;//Variable que guarda el sonido del disparo.
    
    /**
     * Constructor de la clase Enemy
     */
    public Enemy()
    {
        radio = 600;        
        ocupado = false;
        son = new GreenfootSound("shotgun.mp3");
    }
    
    /**
     * Método Act de la clase.
     */
    public void act() 
    {   
        if(!ocupado)                        
            detectaPersonajes();            
        else
        {
            mueve();
            dispara();                
        }                
    }    
    
    /**
     * Detecta si el objetivo esta vivo y si lo está le dispara.
     */
    public void dispara()
    {   
        if(((Duck)obj).estaVivo())
        {
            if(this.intersects(obj))
            {           
                if(obj instanceof Duck || !son.isPlaying())
                {
                    ((Duck)obj).cambiaVivo();
                    ((Duck)obj).modificaScoreEnemy();
                    ocupado = false;
                    radio = 600;
                    son.play();
                }          
            }
        }
        else
        {
            ocupado = false;            
            radio = 600;
        }
    }
    
    /**
     * Coloca al personaje en la posición del objeto que recibe.
     */
    public void mueve()
    {    
        if(((Duck)obj).disponible)
        {
            if(obj.getX() > getX())
                move(6);
            else if(obj.getX() < getX())
                move(-6);
            else if(obj.getY() > getY())
                setLocation(getX(),getY() + 6);
            else if(obj.getY() < getY())
                setLocation(getX(),getY() - 6);
        }
        else        
            ocupado = false;
    }
    
    /**
     * Detecta todos los personajes de la clase Targets y si encuentra un objeto cercano lo guarda y lo sigue.
     */
    public void detectaPersonajes()
    {        
        List lista = getObjectsInRange(radio,Targets.class);        
        Actor otro;               
        if(lista.size() > 0)                 
        {
            Iterator it = lista.iterator();
            while(it.hasNext())
            {
                otro = (Targets)it.next();                                               
                if(otro instanceof Duck)                
                {                    
                    if(((Duck)otro).estaVivo())
                    {
                        obj = otro;
                        ocupado = true;      
                        radio = 100;
                    }
                }
            }
        } 
        else
        {
            switch(Greenfoot.getRandomNumber(2))
            {
                case 0:
                    move(4);
                break;
                case 1:
                    move(-4);
                break;
            }
        }
    }    
}
